#pragma once
#include<iostream>
#include"Comm.hpp"
using namespace std;

class Init   //创建管道文件
{
public:
    Init()
    {
        umask(0);
        int n = mkfifo(gpipeFile.c_str(),gmode);  // .c_str是返回指针的形式
        if(n<0)
        {
            cerr<<"mkfifi error"<<endl;
            return;
        }
        cout<<"mkfifo success"<<endl;
    }
    ~Init()//用完之后就释放掉管道文件unlink
    {
        int n = ::unlink(gpipeFile.c_str());
        if (n < 0)
        {
            std::cerr << "unlink error" << std::endl;
            return;
        }
        std::cout << "unlink success" << std::endl;
    }
};

Init init;

class Serve
{
public:
    Serve():_fd(gdefultfd)
    {

    }
    bool OpenPipeForRead()  //打开管道相当于是打开文件
    {
        _fd = OpenPipe(gForRead);
        if(_fd<0)
        {
            return false;
        }
        return true;
    }

    // std::string *: 输出型参数
    // const std::string &: 输入型参数
    // std::string &: 输入输出型参数
    int RecvPipe(string *out) //读取管道的内容相当于是读取文件
    {
        char buffer[gsize];
        ssize_t n = read(_fd,buffer,sizeof(buffer)-1);//从_fd里面读，读的数据放到buffer里面
        if(n>0)
        {
            buffer[n]=0;
            *out=buffer;
        }
        return n;
    }
    void ClosePipe()//关闭管道
    {
       ClosePipeHelper(_fd);
    }
    ~Serve()
    {

    }
private:
    int _fd;
};